﻿<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
	<title xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory">第 1 章，入门</title>
	<link rel="stylesheet" href="css/espertech.css" type="text/css">
	<meta xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" name="generator" content="DocBook XSL-NS Stylesheets V1.74.0">
	<meta xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" http-equiv="Content-Type" content="text/html; charset=UTF-8">
	<link rel="home" href="index.html" title="Esper Reference">
	<link rel="up" href="index.html" title="Esper Reference">
	<link rel="prev" href="preface.html" title="Preface">
	<link rel="next" href="processingmodel.html" title="Chapter 2. Basic Concepts">
</head>

<body>
	<p xmlns:d="http://docbook.org/ns/docbook" id="title">
		<a href="./index.html" class="site_href"><strong>www.espertech.com</strong></a><a href="http://www.espertech.com/esper/esper-documentation/" class="doc_href"><strong>文档</strong></a>
	</p>
	<ul xmlns:d="http://docbook.org/ns/docbook" class="docnav">
		<li class="previous"><a accesskey="p" href="preface.html"><strong>上一页</strong></a></li>
		<li class="next"><a accesskey="n" href="processingmodel.html"><strong>下一页</strong></a></li>
	</ul>
	<div class="chapter" lang="en-US">
		<div class="titlepage">
			<div>
				<div>
					<h2 class="title">
						<a id="gettingstarted"></a>第1章. 入门
					</h2>
				</div>
			</div>
		</div>
		<div class="toc">
			<dl>
				<dt>
					<a href="gettingstarted.html#gettingstarted_introcep">1.1. 复杂事件处理简介</a>
				</dt>
				<dt>
					<a href="gettingstarted.html#gettingstarted_introarchitecture">1.2. 架构简介</a>
				</dt>
				<dt>
					<a href="gettingstarted.html#gettingstarted_introepl">1.3. EPL简介</a>
				</dt>
				<dt>
					<a href="gettingstarted.html#gettingstarted_compilersteps">1.4. 编译器入门</a>
				</dt>
				<dd>
					<dl>
						<dt>
							<a href="gettingstarted.html#gettingstarted_compilersteps_1">1.4.1. 编译器 - 第一步：设置编译器类路径</a>
						</dt>
						<dt>
							<a href="gettingstarted.html#gettingstarted_compilersteps_2">1.4.2. 编译器 - 第二步：提供输入事件信息</a>
						</dt>
						<dt>
							<a href="gettingstarted.html#gettingstarted_compilersteps_3">1.4.3. 编译器 - 第三步：编译EPL</a>
						</dt>
					</dl>
				</dd>
				<dt>
					<a href="gettingstarted.html#gettingstarted_runtimesteps">1.5. 运行时入门</a>
				</dt>
				<dd>
					<dl>
						<dt>
							<a href="gettingstarted.html#gettingstarted_runtimesteps_1">1.5.1. 运行时 - 第一步：设置运行时类路径</a>
						</dt>
						<dt>
							<a href="gettingstarted.html#gettingstarted_runtimesteps_2">1.5.2. 运行时 - 第二步：获取运行时</a>
						</dt>
						<dt>
							<a href="gettingstarted.html#gettingstarted_runtimesteps_3">1.5.3. 运行时 - 第三步：部署EPL编译模块并附加回调</a>
						</dt>
						<dt>
							<a href="gettingstarted.html#gettingstarted_runtimesteps_4">1.5.4. 运行时 - 第四步：发送事件</a>
						</dt>
					</dl>
				</dd>
				<dt>
					<a href="gettingstarted.html#gettingstarted_required">1.6. 所需的第三方库</a>
				</dt>
				<dd>
					<dl>
						<dt>
							<a href="gettingstarted.html#gettingstarted_required_common">1.6.1. 常见的所需第三方库</a>
						</dt>
						<dt>
							<a href="gettingstarted.html#gettingstarted_required_compiler">1.6.2. 编译器 - 所需的第三方库</a>
						</dt>
						<dt>
							<a href="gettingstarted.html#gettingstarted_required_runtime">1.6.3. 运行时 - 所需的第三方库</a>
						</dt>
					</dl>
				</dd>
			</dl>
		</div>
		<div class="sect1" lang="en-US">
			<div class="titlepage">
				<div>
					<div>
						<h2 class="title">
							<a id="gettingstarted_introcep"></a>1.1. 复杂事件处理简介
						</h2>
					</div>
				</div>
			</div>
			<p>Esper编译器和运行时的开发是为了满足分析事件并对事件做出反应的应用程序的需求。一些典型的应用程序示例包括：</p>
			<div class="itemizedlist">
				<ul compact="compact">
					<li>
						<p>业务流程管理和自动化（流程监控、业务活动监控、报告异常）</p>
					</li>
					<li>
						<p>金融（算法交易、欺诈检测、风险管理）</p>
					</li>
					<li>
						<p>网络和应用程序监控（入侵检测、服务水平协议监控）</p>
					</li>
					<li>
						<p>传感器网络应用（射频识别读取、生产线的调度和控制、空中交通）</p>
					</li>
				</ul>
			</div>
			<p>这些应用程序的共同之处在于需要实时或近实时地处理事件（或消息）。这有时被称为复杂事件处理（CEP）和事件序列分析。对于这些类型的应用程序，关键考虑因素是吞吐量、延迟以及所需逻辑的复杂性。</p>
			<div class="itemizedlist">
				<ul compact="compact">
					<li>
						<p>高吞吐量 - 处理大量消息的应用程序（每秒1000到10万条消息之间）</p>
					</li>
					<li>
						<p>低延迟 - 对发生的情况实时做出反应的应用程序（从几毫秒到几秒）</p>
					</li>
					<li>
						<p>复杂计算 - 检测事件之间模式的应用程序（事件关联）、过滤事件、聚合事件的时间或长度窗口、连接事件序列、基于事件的缺失触发等。</p>
					</li>
				</ul>
			</div>
			<p>EPL编译器和运行时旨在使构建和扩展CEP应用程序更加容易。</p>
			<p>
				有关CEP的更多信息，请访问 <a class="link" href="http://www.espertech.com/esper/esper-faq#whatiscep" target="">常见问题解答</a>。
			</p>
		</div>
		<div class="sect1" lang="en-US">
			<div class="titlepage">
				<div>
					<div>
						<h2 class="title">
							<a id="gettingstarted_introarchitecture"></a>1.2. 架构简介
						</h2>
					</div>
				</div>
			</div>
			<p>Esper是一种语言、一个语言编译器和一个运行时环境。</p>
			<p>Esper语言是事件处理语言（EPL）。它是一种声明性的、面向数据的语言，用于处理高频基于时间的事件数据。 EPL符合SQL-92标准，并在分析事件序列和时间方面进行了扩展。</p>
			<p>Esper编译器将EPL源代码编译成Java虚拟机（JVM）字节码，以便生成的可执行代码在Esper运行时环境中的JVM上运行。</p>
			<p>Esper运行时在JVM之上运行。您可以使用Esper运行时运行由Esper编译器生成的字节码。</p>
			<p>Esper架构类似于其他编译为JVM字节码的编程语言，例如Scala、Clojure和Kotlin。 然而，Esper EPL不是一种命令式（过程式）编程语言。</p>
		</div>
		<div class="sect1" lang="en-US">
			<div class="titlepage">
				<div>
					<div>
						<h2 class="title">
							<a id="gettingstarted_introepl"></a>1.3. EPL简介
						</h2>
					</div>
				</div>
			</div>
			<p>Esper语言是为复杂事件处理和流分析设计的事件处理语言（EPL）。</p>
			<p>
				EPL被组织成模块。模块由编译器编译成字节码。我们将EPL源代码单元称为 <em>模块</em>。
			</p>
			<p>
				一个模块由语句组成。语句是用于执行事件和时间分析的声明性代码。大多数语句的形式为
				<code class="literal">"select ... from ..."</code>
				。 我们将构成模块的每个声明性代码单元称为 <em>语句</em>。
			</p>
			<p>您的应用程序通过回调或迭代语句的当前结果来接收语句的输出。</p>
			<p>一条语句可以声明一个EPL对象，如下所示：</p>
			<div class="itemizedlist">
				<ul compact="compact">
					<li>
						<p>
							<em>事件类型</em> 定义流类型信息，并使用
							<code class="literal">create schema</code>
							或通过配置添加。
						</p>
					</li>
					<li>
						<p>
							<em>变量</em> 是自由格式的值持有者，并使用
							<code class="literal">create variable</code>
							或通过配置添加。
						</p>
					</li>
					<li>
						<p>
							<em>命名窗口</em> 是可共享的命名数据窗口，并使用
							<code class="literal">create window</code>
							添加。
						</p>
					</li>
					<li>
						<p>
							<em>表</em> 是具有列的可共享组织行，列可以是简单类型、聚合类型和复杂类型，并使用
							<code class="literal">create table</code>
							添加。
						</p>
					</li>
					<li>
						<p>
							<em>上下文</em> 定义分析生命周期，并使用
							<code class="literal">create context</code>
							添加。
						</p>
					</li>
					<li>
						<p>
							<em>表达式</em> 和 <em>脚本</em> 是可重用的表达式，并使用
							<code class="literal">create expression</code>
							添加。
						</p>
					</li>
					<li>
						<p>
							<em>索引</em> 组织命名窗口事件和表行以实现快速查找，并使用
							<code class="literal">create index</code>
							添加。
						</p>
					</li>
				</ul>
			</div>
			<p>
				使用访问修饰符，如
				<code class="literal">private</code>
				、
				<code class="literal">protected</code>
				和
				<code class="literal">public</code>
				来控制对EPL对象的访问。
			</p>
			<p>一个模块可以有一个可选的模块名称。模块名称的用途类似于编程语言中的包名称或命名空间名称。模块名称用于组织EPL对象并避免名称冲突。</p>
			<p>在部署已编译的模块时，运行时会为部署分配一个部署ID。部署ID唯一标识已编译模块的给定部署。 一个已编译的模块可以进行参数化并多次部署。</p>
			<p>一条语句总是有一个语句名称。语句名称在已部署的模块中标识一条语句，并且在一次部署中是唯一的。部署ID和语句名称的组合 在运行时中唯一标识一条语句。</p>
			<p>EPL是类型安全的，因为EPL不允许对对象执行对该对象无效的操作。</p>
		</div>
		<div class="sect1" lang="en-US">
			<div class="titlepage">
				<div>
					<div>
						<h2 class="title">
							<a id="gettingstarted_compilersteps"></a>1.4. 编译器入门
						</h2>
					</div>
				</div>
			</div>
			<div class="sect2" lang="en-US">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title">
								<a id="gettingstarted_compilersteps_1"></a>1.4.1. 编译器 - 第一步：设置编译器类路径
							</h3>
						</div>
					</div>
				</div>
				<p>
					请将Esper编译器jar文件、通用jar文件和编译器依赖项添加到将编译EPL的程序的类路径中。 除了
					<code class="literal">esper-common-</code>
					<em>版本</em>
					<code class="literal">.jar</code>
					之外，运行时不需要此处列出的jar文件。
				</p>
				<div class="itemizedlist">
					<ul>
						<li>
							<p>
								通用jar文件
								<code class="literal">esper-common-</code>
								<em>版本</em>
								<code class="literal">.jar</code>
							</p>
						</li>
						<li>
							<p>
								编译器jar文件
								<code class="literal">esper-compiler-</code>
								<em>版本</em>
								<code class="literal">.jar</code>
							</p>
						</li>
						<li>
							<p>
								ANTLR解析器jar文件
								<code class="literal">antlr4-runtime-4.13.1.jar</code>
							</p>
						</li>
						<li>
							<p>
								SLF4J日志记录库
								<code class="literal">slf4j-api-1.7.36.jar</code>
							</p>
						</li>
						<li>
							<p>
								Janino Java编译器
								<code class="literal">janino-3.1.9.jar</code>
								和
								<code class="literal">commons-compiler-3.1.9.jar</code>
							</p>
						</li>
					</ul>
				</div>
				<p>如果需要使用Reload4J或Log4j进行日志记录，请将相应的日志jar文件添加到类路径中。</p>
				<p>使用Esper处理JSON格式的事件文档时，Esper不需要其他jar文件。</p>
				<p>
					如果需要使用Apache Avro，请将
					<code class="literal">esper-common-avro-</code>
					<em>版本</em>
					<code class="literal">.jar</code>
					添加到类路径中。
				</p>
				<p>
					如果需要使用XML XSD模式定义事件类型，请将
					<code class="literal">esper-common-xmlxsd-</code>
					<em>版本</em>
					<code class="literal">.jar</code>
					添加到类路径中。
				</p>
			</div>
			<div class="sect2" lang="en-US">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title">
								<a id="gettingstarted_compilersteps_2"></a>1.4.2. 编译器 - 第二步：提供输入事件信息
							</h3>
						</div>
					</div>
				</div>
				<p>您的应用程序可以注册一个事件类型，以指示编译器输入事件的样子。在编译模块时，编译器会检查可用的事件类型信息，以确定模块是否有效。</p>
				<p>
					此示例假设存在一个Java类
					<code class="literal">PersonEvent</code>
					，并且
					<code class="literal">PersonEvent</code>
					类的每个实例都是一个事件。
				</p>
				<div xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="tip">
					<h2>提示</h2>
					<p>不必为每个事件类型创建类。</p>
					<p>
						不必预先配置每个事件类型。也不必设置
						<code class="literal">Configuration</code>
						对象。
					</p>
					<p>这个分步指南让您可以轻松上手。</p>
				</div>
				<p>我们的分步示例中的事件类如下：</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">package com.mycompany.myapp;

public class PersonEvent {
  private String name;
  private int age;

  public PersonEvent(String name, int age) {
    this.name = name;
    this.age = age;
  }

  public String getName() {
    return name;
  ｝
public int getAge() {
return age;
}
}</pre>
				<p>
					不同的事件表示形式将在 <a class="xref" href="event_representation.html#eventrep_comparing" title="3.5. 比较事件表示形式">第3.5节，“比较事件表示形式”</a> 中讨论。
				</p>
				<p>
					有关使用EPL通过
					<code class="literal">create schema</code>
					声明事件类型的信息，请参阅 <a class="xref" href="epl_clauses.html#epl_createschema" title="5.15. 声明事件类型：创建模式">第5.15节，“声明事件类型：创建模式”</a>。
				</p>
			</div>
			<div class="sect2" lang="en-US">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title">
								<a id="gettingstarted_compilersteps_3"></a>1.4.3. 编译器 - 第三步：编译EPL
							</h3>
						</div>
					</div>
				</div>
				<p>
					您的应用程序可以通过调用
					<code class="literal">EPCompilerProvider</code>
					类的
					<code class="literal">getCompiler</code>
					静态方法来获取编译器：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">EPCompiler compiler = EPCompilerProvider.getCompiler();</pre>
				<p>
					这个分步示例向编译器提供了一个
					<code class="literal">Configuration</code>
					对象，该对象添加了预定义的人员事件：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">Configuration configuration = new Configuration();
configuration.getCommon().addEventType(PersonEvent.class);</pre>
				<p>
					这个入门部分的示例模块只有一条语句，该语句选择每个到达的人员事件的姓名和年龄。 它使用
					<code class="literal">@name</code>
					注解指定一个语句名称，并为该语句分配名称
					<code class="literal">my-statement</code>
					。
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">@name('my-statement') select name, age from PersonEvent</pre>
				<p>
					使用
					<code class="literal">compile</code>
					方法编译模块，将配置作为编译器参数的一部分传递：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">CompilerArguments args = new CompilerArguments(configuration);
EPCompiled epCompiled;
try {
epCompiled = compiler.compile ("@name ('my-statement') select name, age from PersonEvent", args);
}
catch (EPCompileException ex) {
// 在此处处理异常
throw new RuntimeException (ex);
}</pre>
				<p>
					在编译这个模块时，编译器会验证
					<code class="literal">PersonEvent</code>
					是否存在，因为它在
					<code class="literal">from</code>
					子句中列出。 编译器还会验证
					<code class="literal">PersonEvent</code>
					是否存在
					<code class="literal">name</code>
					和
					<code class="literal">age</code>
					属性，因为它们在
					<code class="literal">select</code>
					子句中列出。 编译器生成用于提取属性值和生成输出事件的字节码。 编译器构建内部数据结构，供过滤器索引稍后使用，以确保当
					<code class="literal">PersonEvent</code>
					事件到来时能够快速处理。
				</p>
				<p>
					有关编译API的更多信息，请参阅 <a class="xref" href="apicompiler.html" title="第15章. 编译器参考">第15章，《编译器参考》</a> 和JavaDoc文档。
				</p>
			</div>
		</div>
		<div class="sect1" lang="en-US">
			<div class="titlepage">
				<div>
					<div>
						<h2 class="title">
							<a id="gettingstarted_runtimesteps"></a>1.5. 运行时入门
						</h2>
					</div>
				</div>
			</div>
			<div class="sect2" lang="en-US">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title">
								<a id="gettingstarted_runtimesteps_1"></a>1.5.1. 运行时 - 第一步：设置运行时类路径
							</h3>
						</div>
					</div>
				</div>
				<p>请将Esper通用jar文件、运行时jar文件和运行时依赖项添加到将执行已编译模块的程序的类路径中。 运行时jar文件对于编译器来说不是必需的。</p>
				<div class="itemizedlist">
					<ul>
						<li>
							<p>
								通用jar文件
								<code class="literal">esper-common-</code>
								<em>版本</em>
								<code class="literal">.jar</code>
							</p>
						</li>
						<li>
							<p>
								运行时jar文件
								<code class="literal">esper-runtime-</code>
								<em>版本</em>
								<code class="literal">.jar</code>
							</p>
						</li>
						<li>
							<p>
								SLF4J日志记录库
								<code class="literal">slf4j-api-1.7.25.jar</code>
							</p>
						</li>
					</ul>
				</div>
				<p>
					如果需要使用Log4j进行日志记录，请将
					<code class="literal">slf4j-log4j12-1.7.25.jar</code>
					和
					<code class="literal">log4j-1.2.17.jar</code>
					添加到类路径中。
				</p>
				<p>使用Esper处理JSON格式的事件文档时，Esper不需要其他jar文件。</p>
				<p>
					如果需要使用Apache Avro，请将
					<code class="literal">esper-common-avro-</code>
					<em>版本</em>
					<code class="literal">.jar</code>
					添加到类路径中。
				</p>
				<p>
					如果需要使用XML XSD模式定义事件类型，请将
					<code class="literal">esper-common-xmlxsd-</code>
					<em>版本</em>
					<code class="literal">.jar</code>
					添加到类路径中。
				</p>
			</div>
			<div class="sect2" lang="en-US">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title">
								<a id="gettingstarted_runtimesteps_2"></a>1.5.2. 运行时 - 第二步：获取运行时
							</h3>
						</div>
					</div>
				</div>
				<p>
					这个分步示例向运行时提供了一个
					<code class="literal">Configuration</code>
					对象，该对象添加了预定义的人员事件：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">Configuration configuration = new Configuration();
configuration.getCommon().addEventType(PersonEvent.class);</pre>
				<div xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="tip">
					<h2>提示</h2>
					<p>
						不必预先配置每个事件类型。也不必设置
						<code class="literal">Configuration</code>
						对象。
					</p>
					<p>
						然而，对于这个示例，由于编译器将
						<code class="literal">PersonEvent</code>
						作为预定义类型，因此运行时也必须对其进行预配置。
					</p>
				</div>
				<p>
					您的应用程序可以通过调用
					<code class="literal">EPRuntimeProvider</code>
					类的
					<code class="literal">getDefaultRuntime</code>
					静态方法并传递配置来获取运行时：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">EPRuntime runtime = EPRuntimeProvider.getDefaultRuntime(configuration);</pre>
				<p>
					有关运行时的更多信息，请参阅 <a class="xref" href="apiruntime.html" title="第16章. 运行时参考">第16章，《运行时参考》</a> 和JavaDoc文档。
				</p>
				<p>
					有关配置的更多信息，请参阅 <a class="xref" href="configuration.html" title="第17章. 配置">第17章，《配置》</a> 和JavaDoc文档。
				</p>
			</div>
			<div class="sect2" lang="en-US">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title">
								<a id="gettingstarted_runtimesteps_3"></a>1.5.3. 运行时 - 第三步：部署EPL编译模块并附加回调
							</h3>
						</div>
					</div>
				</div>
				<p>
					您的应用程序可以使用管理接口的
					<code class="literal">deploy</code>
					方法部署已编译的模块。
				</p>
				<p>API调用如下：</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">EPDeployment deployment;
try {
deployment = runtime.getDeploymentService().deploy(epCompiled);
}
catch (EPDeployException ex) {
// 在此处处理异常
throw new RuntimeException(ex);
}</pre>
				<p>
					作为部署的一部分，运行时会验证所有模块依赖项（如事件类型）是否确实存在。 在部署期间，运行时会向过滤器索引添加条目，以确保当
					<code class="literal">PersonEvent</code>
					事件到来时能够快速处理。
				</p>
				<p>
					您的应用程序可以向
					<code class="literal">EPStatement</code>
					附加一个回调，以接收语句结果。以下示例回调只是打印姓名和年龄：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">EPStatement statement = runtime.getDeploymentService().getStatement(deployment.getDeploymentId(), "my-statement");
statement.addListener( (newData, oldData, statement, runtime) -> {
String name = (String) newData[0].get("name");
int age = (int) newData[0].get("age");
System.out.println(String.format("Name: %s, Age: %d", name, age));
});</pre>
				plaintext &#x3C;p&#x3E; &#x60A8;&#x7684;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x53EF;&#x4EE5;&#x63D0;&#x4F9B;&#x4E0D;&#x540C;&#x7C7B;&#x578B;&#x7684;&#x56DE;&#x8C03;&#xFF0C;&#x8BF7;&#x53C2;&#x9605; &#x3C;a class=&#x22;xref&#x22; href=&#x22;apiruntime.html#apiruntime-statement-receiveresults&#x22; title=&#x22;&#x8868;16.2. &#x63A5;&#x6536;&#x8BED;&#x53E5;&#x7ED3;&#x679C;&#x7684;&#x9009;&#x62E9;&#x22;&#x3E;&#x8868;16.2&#xFF0C;&#x201C;&#x63A5;&#x6536;&#x8BED;&#x53E5;&#x7ED3;&#x679C;&#x7684;&#x9009;&#x62E9;&#x201D;&#x3C;/a&#x3E;&#x3002; &#x3C;/p&#x3E;
			</div>
			<div class="sect2" lang="en-US">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title">
								<a id="gettingstarted_runtimesteps_4"></a>1.5.4. 运行时 - 第四步：发送事件
							</h3>
						</div>
					</div>
				</div>
				<p>
					您的应用程序可以使用运行时接口的
					<code class="literal">sendEventBean</code>
					方法（或其他与您选择的事件匹配的
					<code class="literal">sendEvent</code>
					方法）将事件发送到运行时：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">runtime.getEventService().sendEventBean(new PersonEvent("Peter", 10), "PersonEvent");</pre>
				<p>您应该看到的输出是：</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">Name: Peter, Age: 10</pre>
				<p>
					在将
					<code class="literal">PersonEvent</code>
					事件对象发送到运行时后，运行时会查询内部维护的共享过滤器索引树结构，以确定是否有任何语句对
					<code class="literal">PersonEvent</code>
					事件感兴趣。 作为此示例一部分部署的语句在
					<code class="literal">from</code>
					子句中有
					<code class="literal">PersonEvent</code>
					，因此运行时会将此类事件的处理委托给该语句。 已编译的字节码通过调用
					<code class="literal">getName</code>
					和
					<code class="literal">getAge</code>
					方法获取姓名和年龄属性。
				</p>
			</div>
		</div>
		<div class="sect1" lang="en-US">
			<div class="titlepage">
				<div>
					<div>
						<h2 class="title">
							<a id="gettingstarted_required"></a>1.6. 所需的第三方库
						</h2>
					</div>
				</div>
			</div>
			<div class="sect2" lang="en-US">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title">
								<a id="gettingstarted_required_common"></a>1.6.1. 常见的所需第三方库
							</h3>
						</div>
					</div>
				</div>
				<p>编译器和运行时都需要以下第三方库：</p>
				<div class="itemizedlist">
					<ul compact="compact">
						<li>
							<p>
								SLF4J是一个日志记录API，可以与LOG4J和其他日志记录API一起使用。虽然SLF4J是必需的，但LOG4J日志组件不是必需的，可以用其他日志记录器替换。SLF4J根据
								<code class="literal">lib/esper_3rdparties.license</code>
								中提供的Apache 2.0许可证进行授权。
							</p>
						</li>
					</ul>
				</div>
			</div>
			<div class="sect2" lang="en-US">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title">
								<a id="gettingstarted_required_compiler"></a>1.6.2. 编译器 - 所需的第三方库
							</h3>
						</div>
					</div>
				</div>
				<p>编译器仅在编译时（而不是在运行时）需要以下第三方库：</p>
				<div class="itemizedlist">
					<ul compact="compact">
						<li>
							<p>
								ANTLR是用于解析和遍历模式和EPL语法的解析树的解析器生成器。感谢Terence Parr，网址为http://www.antlr.org。ANTLR许可证是BSD许可证，并在
								<code class="literal">lib/esper_3rdparties.license</code>
								中提供。运行时需要
								<code class="literal">antlr-runtime</code>
								运行时库。
							</p>
						</li>
						<li>
							<p>
								Janino是一个小型且快速的Java编译器。编译器生成代码并使用Janino编译生成的代码。Janino根据
								<code class="literal">lib/esper_3rdparties.license</code>
								中提供的三条款新BSD许可证进行授权。
							</p>
						</li>
					</ul>
				</div>
			</div>
			<div class="sect2" lang="en-US">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title">
								<a id="gettingstarted_required_runtime"></a>1.6.3. 运行时 - 所需的第三方库
							</h3>
						</div>
					</div>
				</div>
				<p>运行时不需要任何其他第三方库。</p>
			</div>
		</div>
	</div>
	<ul xmlns:d="http://docbook.org/ns/docbook" class="docnav">
		<li class="previous"><a accesskey="p" href="preface.html"><strong>上一页</strong>前言</a></li>
		<li class="up"><a accesskey="u" href="#"><strong>页面顶部</strong>

</html>